/******************************************************************************/
/* Fichero: Gui.java
/* Versión: 1.0
/* Autor: Javier Navajas
/* Fecha: Abril 2009
/* Proyecto: Gestor de Cumpleaños de AelanSoft - Cliente
/* Descripción: Interfaz del cliente de la
/******************************************************************************/
package interfaz;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import rmi.*;

import utiles.*;

/******************************************************************************/
public class Gui extends JFrame {
/******************************************************************************/

   // Constantes. Ancho y Alto de Ventana
   private static final int ANCHOVENTANA = 650;
   private static final int ALTOVENTANA = 350;

   // Variables. wBarraDeMenus
   private JMenuBar jMenuBarBarraDeMenus;
   private JMenu jMenuArchivo;
   private JMenuItem jMenuItemArchivoSalir;
   private JMenu jMenuAyuda;
   private JMenuItem jMenuItemAyudaAcercaDe;

   // Variables. wLogin
   private JPanel jPanelLogin;
   private JLabel jLabelLoginCorreoElectronico;
   private JLabel jLabelLoginContrasena;
   private JTextField jTextFieldLoginCorreoElectronico;
   private JPasswordField jPasswordFieldLoginContrasena;
   private JButton jButtonLoginEntrar;
   private JButton jButtonLoginRegistrarse;

   // Variables. wRegistro
   private JPanel jPanelRegistro;
   private JLabel jLabelRegistroNombre;
   private JLabel jLabelRegistroApellidos;
   private JLabel jLabelRegistroCumpleanos;
   private JPanel jPanelRegistroCumpleanos;
   private JLabel jLabelRegistroDia;
   private JLabel jLabelRegistroMes;
   private JLabel jLabelRegistroCorreoElectronico;
   private JLabel jLabelRegistroContrasena;
   private JLabel jLabelRegistroConfirmar;
   private JTextField jTextFieldRegistroNombre;
   private JTextField jTextFieldRegistroApellidos;
   private JComboBox jComboBoxRegistroDia;
   private JComboBox jComboBoxRegistroMes;
   private JTextField jTextFieldRegistroCorreoElectronico;
   private JPasswordField jPasswordFieldRegistroContrasena;
   private JPasswordField jPasswordFieldRegistroConfirmar;
   private JButton jButtonRegistroRegistrarse;
   private JButton jButtonRegistroCancelar;

   // Variables. wInicio
   private JPanel jPanelInicio;
   private Vector<String> vectorInicioAmigosCabecera;
   private CustomTableModel customTableModelInicioAmigos;
   private JScrollPane jScrollPaneInicioAmigos;
   private JTable jTableInicioAmigos;
   private JTextField jTextFieldInicioBuscar;
   private JButton jButtonInicioBuscarAmigos;
   private JButton jButtonInicioVerAmigos;
   private JButton jButtonInicioCumpleanosHoy;
   private JButton jButtonInicioAnadirAmigo;
   private JButton jButtonInicioIzquierda;
   private JButton jButtonInicioDerecha;

   // Variables. wBusqueda
   private JPanel jPanelBusqueda;
   private Vector<String> vectorBusquedaAmigosCabecera;
   private CustomTableModel customTableModelBusquedaAmigos;
   private JScrollPane jScrollPaneBusquedaAmigos;
   private JTable jTableBusquedaAmigos;
   private JTextField jTextFieldBusquedaBuscar;
   private JButton jButtonBusquedaBuscarAmigos;
   private JButton jButtonBusquedaVerAmigos;
   private JButton jButtonBusquedaCumpleanosHoy;
   private JButton jButtonBusquedaAnadirAmigo;
   private JButton jButtonBusquedaIzquierda;
   private JButton jButtonBusquedaDerecha;

   // Variables. wCumpleanosHoy
   private JDialog jDialogCumpleanosHoy;
   private JPanel jPanelCumpleanosHoy;
   private Vector<String> vectorCumpleanosHoyAmigosCabecera;
   private CustomTableModel customTableModelCumpleanosHoyAmigos;
   private JScrollPane jScrollPaneCumpleanosHoyAmigos;
   private JTable jTableCumpleanosHoyAmigos;
   private JButton jButtonCumpleanosHoyCerrar;

   // Variables. wCumpleanosHoy
   private JDialog jDialogAcercaDe;
   private JPanel jPanelAcercaDe;
   private JLabel jLabelAcercaDeImagen;
   private JLabel jLabelAcercaDeTitulo;
   private JLabel jLabelAcercaDeTexto1;
   private JLabel jLabelAcercaDeTexto2;
   private JLabel jLabelAcercaDeVersion;
   private JLabel jLabelAcercaDeCompania;
   private JLabel jLabelAcercaDeWeb;
   private JLabel jLabelAcercaDeVersionTexto;
   private JLabel jLabelAcercaDeCompaniaTexto;
   private JLabel jLabelAcercaDeWebTexto;
   private JButton jButtonAcercaDeCerrar;

   // Variables. Propiedades de posicionamiento en un GridBagLayout
   GridBagConstraints constraints = new GridBagConstraints();

   // Variables
   private Cliente cliente;

   /****************************************************************************
    * Constructor de la clase Gui.
    * @param args parametros de entrada al programa
    ***************************************************************************/
   public Gui(String[] args) {
      // Variables
      int estado;

      // Creacion de las estructuras de datos iniciales
      cliente = new Cliente();

      // Conexion con el servidor
      estado = cliente.ConectarServidor(args[0], args[1], args[2]);
      switch(estado) {
         case (0):
            // Inicializacion de la Gui
            wInicializarGui();
            break;
         default:
            // Informar del error y salir
            System.out.println("Error: no se puede conectar con el servidor.");
      }

   }

   /****************************************************************************
    * Inicializa la interfaz grafica
    ***************************************************************************/
   private void wInicializarGui() {
      // Creacion de la barra de menus
      wBarraDeMenus();

      // Creacion de las pantallas de la interfaz
      wLogin();
      wRegistro();
      wInicio();
      wBusqueda();
      wCumpleanosHoy();
      wAcercaDe();

      // Creacion del manejador de eventos
      ManejadorEventos();

      // Mostramos la pantalla de login
      getContentPane().setLayout(new CardLayout());
      getContentPane().add("Login", jPanelLogin);
      getContentPane().add("Registro", jPanelRegistro);
      getContentPane().add("Inicio", jPanelInicio);
      getContentPane().add("Busqueda", jPanelBusqueda);

      // Atributos de la ventana
      this.setTitle("Gestor de Cumpleaños");
      this.setSize(ANCHOVENTANA, ALTOVENTANA);
      this.setLocationRelativeTo(null);
      this.setMinimumSize(this.getSize());
      this.setVisible(true);
   }

   /****************************************************************************
    * Crea la barra de menus de la interfaz grafica
    ***************************************************************************/
   private void wBarraDeMenus() {
      // Menu jMenuBarMenu
      jMenuBarBarraDeMenus = new JMenuBar();
      setJMenuBar(jMenuBarBarraDeMenus);

      // Menu jMenuArchivo
      jMenuArchivo = new JMenu("Archivo");
      jMenuArchivo.setMnemonic('A');
      jMenuBarBarraDeMenus.add(jMenuArchivo);
      // Menu jMenuItemArchivoSalir
      jMenuItemArchivoSalir = new JMenuItem("Salir");
      jMenuItemArchivoSalir.setMnemonic('S');
      jMenuItemArchivoSalir.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
         InputEvent.CTRL_MASK));
      jMenuArchivo.add(jMenuItemArchivoSalir);

      // Menu jMenuAyuda
      jMenuAyuda = new JMenu("Ayuda");
      jMenuAyuda.setMnemonic('U');
      jMenuBarBarraDeMenus.add(jMenuAyuda);
      // Menu jMenuItemAyudaAcercaDe
      jMenuItemAyudaAcercaDe = new JMenuItem("Acerca De...");
      jMenuItemAyudaAcercaDe.setMnemonic('D');
      jMenuItemAyudaAcercaDe.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_D,
         InputEvent.CTRL_MASK));
      jMenuAyuda.add(jMenuItemAyudaAcercaDe);
   }

   /****************************************************************************
    * Crea la pantalla inicial de login de la aplicacion.
    ***************************************************************************/
   private void wLogin() {
      // Administrador de diseno jPanelLogin
      jPanelLogin = new JPanel();
      jPanelLogin.setLayout(new GridBagLayout());

      // Etiqueta jLabelLoginCorreoElectronico
      jLabelLoginCorreoElectronico = new JLabel("Correo Electronico");
      constraints = wPosicionamiento(constraints, 0, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelLogin.add(jLabelLoginCorreoElectronico, constraints);

      // Caja de texto jTextFieldLoginCorreoElectronico
      jTextFieldLoginCorreoElectronico = new JTextField(21);
      constraints = wPosicionamiento(constraints, 0, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelLogin.add(jTextFieldLoginCorreoElectronico, constraints);

      // Etiqueta jLabelLoginContrasena
      jLabelLoginContrasena = new JLabel("Contraseña");
      constraints = wPosicionamiento(constraints, 1, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelLogin.add(jLabelLoginContrasena, constraints);

      // Caja de texto jPasswordFieldLoginContrasena
      jPasswordFieldLoginContrasena = new JPasswordField(21);
      constraints = wPosicionamiento(constraints, 1, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelLogin.add(jPasswordFieldLoginContrasena, constraints);

      // Boton jButtonLoginEntrar
      jButtonLoginEntrar = new JButton("  Entrar  ");
      constraints = wPosicionamiento(constraints, 2, 1, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelLogin.add(jButtonLoginEntrar, constraints);

      // Boton jButtonLoginRegistrarse
      jButtonLoginRegistrarse = new JButton("Registrarse");
      constraints = wPosicionamiento(constraints, 2, 2, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelLogin.add(jButtonLoginRegistrarse, constraints);
   }

   /****************************************************************************
    * Crea la pantalla de registro de la aplicacion.
    ***************************************************************************/
   private void wRegistro() {
      // Administrador de diseno jPanelRegistro
      jPanelRegistro = new JPanel();
      jPanelRegistro.setLayout(new GridBagLayout());

      // Etiqueta jLabelRegistroNombre
      jLabelRegistroNombre = new JLabel("Nombre");
      constraints = wPosicionamiento(constraints, 0, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelRegistro.add(jLabelRegistroNombre, constraints);

      // Caja de texto jTextFieldRegistroNombre
      jTextFieldRegistroNombre = new JTextField(21);
      constraints = wPosicionamiento(constraints, 0, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelRegistro.add(jTextFieldRegistroNombre, constraints);

      // Etiqueta jLabelRegistroApellidos
      jLabelRegistroApellidos = new JLabel("Apellidos");
      constraints = wPosicionamiento(constraints, 1, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelRegistro.add(jLabelRegistroApellidos, constraints);

      // Caja de texto jTextFieldRegistroApellidos
      jTextFieldRegistroApellidos = new JTextField(21);
      constraints = wPosicionamiento(constraints, 1, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelRegistro.add(jTextFieldRegistroApellidos, constraints);

      // Etiqueta jLabelRegistroCumpleanos
      jLabelRegistroCumpleanos = new JLabel("Fecha de cumpleaños");
      constraints = wPosicionamiento(constraints, 2, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelRegistro.add(jLabelRegistroCumpleanos, constraints);

      // Panel jPanelRegistroCumpleanos
      jPanelRegistroCumpleanos = new JPanel();
      jPanelRegistroCumpleanos.setLayout(new GridBagLayout());
      constraints = wPosicionamiento(constraints, 2, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelRegistro.add(jPanelRegistroCumpleanos, constraints);
      // Etiqueta jLabelRegistroDia
      jLabelRegistroDia = new JLabel("Dia");
      constraints = wPosicionamiento(constraints, 0, 0, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(0,15,0,0));
      jPanelRegistroCumpleanos.add(jLabelRegistroDia, constraints);
      // Lista desplegable jComboBoxRegistroDia
      Integer[] dias = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,
         22,23,24,25,26,27,28,29,30,31};
      jComboBoxRegistroDia = new JComboBox(dias);
      constraints = wPosicionamiento(constraints, 0, 1, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(0,5,0,5));
      jPanelRegistroCumpleanos.add(jComboBoxRegistroDia, constraints);
      // Etiqueta jLabelRegistroMes
      jLabelRegistroMes = new JLabel("Mes");
      constraints = wPosicionamiento(constraints, 0, 2, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(0,8,0,0));
      jPanelRegistroCumpleanos.add(jLabelRegistroMes, constraints);
      // Lista desplegable jComboBoxRegistroMes
      String[] meses = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
         "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
      jComboBoxRegistroMes = new JComboBox(meses);
      constraints = wPosicionamiento(constraints, 0, 3, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(0,5,0,15));
      jPanelRegistroCumpleanos.add(jComboBoxRegistroMes, constraints);

      // Etiqueta jLabelRegistroCorreoElectronico
      jLabelRegistroCorreoElectronico = new JLabel("Correo electronico");
      constraints = wPosicionamiento(constraints, 3, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelRegistro.add(jLabelRegistroCorreoElectronico, constraints);

      // Caja de texto jTextFieldRegistroCorreoElectronico
      jTextFieldRegistroCorreoElectronico = new JTextField(21);
      constraints = wPosicionamiento(constraints, 3, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelRegistro.add(jTextFieldRegistroCorreoElectronico, constraints);

      // Etiqueta jLabelRegistroContrasena
      jLabelRegistroContrasena = new JLabel("Contraseña");
      constraints = wPosicionamiento(constraints, 4, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelRegistro.add(jLabelRegistroContrasena, constraints);

      // Caja de texto jPasswordFieldRegistroContrasena
      jPasswordFieldRegistroContrasena = new JPasswordField(21);
      constraints = wPosicionamiento(constraints, 4, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelRegistro.add(jPasswordFieldRegistroContrasena, constraints);

      // Etiqueta jLabelRegistroConfirmar
      jLabelRegistroConfirmar = new JLabel("Confirmar");
      constraints = wPosicionamiento(constraints, 5, 0, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelRegistro.add(jLabelRegistroConfirmar, constraints);

      // Caja de texto jPasswordFieldRegistroConfirmar
      jPasswordFieldRegistroConfirmar = new JPasswordField(21);
      constraints = wPosicionamiento(constraints, 5, 1, 2, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,5));
      jPanelRegistro.add(jPasswordFieldRegistroConfirmar, constraints);

      // Boton jButtonRegistroRegistrarse
      jButtonRegistroRegistrarse = new JButton("Registrarse");
      constraints = wPosicionamiento(constraints, 6, 1, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,20,5,5));
      jPanelRegistro.add(jButtonRegistroRegistrarse, constraints);

      // Boton jButtonRegistroCancelar
      jButtonRegistroCancelar = new JButton(" Cancelar ");
      constraints = wPosicionamiento(constraints, 6, 2, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,5,20));
      jPanelRegistro.add(jButtonRegistroCancelar, constraints);
   }

   /****************************************************************************
    * Crea la pantalla principal de la aplicacion.
    ***************************************************************************/
   private void wInicio() {
      // Administrador de diseno jPanelInicio
      jPanelInicio = new JPanel();
      jPanelInicio.setLayout(new GridBagLayout());

      // Tabla jTableInicioAmigos
      vectorInicioAmigosCabecera = new Vector<String>();
      vectorInicioAmigosCabecera.add("Nombre");
      vectorInicioAmigosCabecera.add("Apellidos");
      vectorInicioAmigosCabecera.add("Cumpleaños");
      vectorInicioAmigosCabecera.add("Correo Electronico");
      customTableModelInicioAmigos = new CustomTableModel();
      customTableModelInicioAmigos.setDataVector(new Vector<Vector<String>>(),
         vectorInicioAmigosCabecera);
      jTableInicioAmigos = new JTable(customTableModelInicioAmigos);
      jTableInicioAmigos.getTableHeader().setReorderingAllowed(false);
      jTableInicioAmigos.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
      constraints = wPosicionamiento(constraints, 0, 0, 1, 6, 1, 0,
         GridBagConstraints.BOTH, new Insets(5,10,5,5));
      jScrollPaneInicioAmigos = new JScrollPane(jTableInicioAmigos,
         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      jPanelInicio.add(jScrollPaneInicioAmigos, constraints);

      // Caja de texto jTextFieldInicioBuscar
      jTextFieldInicioBuscar = new JTextField(32);
      constraints = wPosicionamiento(constraints, 0, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelInicio.add(jTextFieldInicioBuscar, constraints);

      // Boton jButtonInicioBuscarAmigos
      jButtonInicioBuscarAmigos = new JButton("Buscar Amigos");
      constraints = wPosicionamiento(constraints, 1, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelInicio.add(jButtonInicioBuscarAmigos, constraints);

      // Boton jButtonInicioVerAmigos
      jButtonInicioVerAmigos = new JButton("Ver Amigos");
      constraints = wPosicionamiento(constraints, 2, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelInicio.add(jButtonInicioVerAmigos, constraints);

      // Boton jButtonInicioCumpleanosHoy
      jButtonInicioCumpleanosHoy = new JButton("Cumpleaños Hoy");
      constraints = wPosicionamiento(constraints, 3, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelInicio.add(jButtonInicioCumpleanosHoy, constraints);

      // Boton jButtonInicioAnadirAmigo
      jButtonInicioAnadirAmigo = new JButton("Añadir Amigo");
      jButtonInicioAnadirAmigo.setEnabled(false);
      constraints = wPosicionamiento(constraints, 4, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelInicio.add(jButtonInicioAnadirAmigo, constraints);

      // Boton jButtonInicioIzquierda
      jButtonInicioIzquierda = new JButton("");
      jButtonInicioIzquierda.setIcon(new
         ImageIcon(getClass().getResource("/interfaz/imagenes/izquierda.gif")));
      constraints = wPosicionamiento(constraints, 5, 1, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(30,15,10,5));
      jPanelInicio.add(jButtonInicioIzquierda, constraints);
      // Boton jButtonInicioDerecha
      jButtonInicioDerecha = new JButton("");
      jButtonInicioDerecha.setIcon(new
         ImageIcon(getClass().getResource("/interfaz/imagenes/derecha.gif")));
      constraints = wPosicionamiento(constraints, 5, 2, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(30,5,10,20));
      jPanelInicio.add(jButtonInicioDerecha, constraints);

   }

   /****************************************************************************
    * Crea la pantalla de busqueda de la aplicacion.
    ***************************************************************************/
   private void wBusqueda() {
      // Administrador de diseno jPanelBusqueda
      jPanelBusqueda = new JPanel();
      jPanelBusqueda.setLayout(new GridBagLayout());

      // Tabla jTableBusquedaAmigos
      vectorBusquedaAmigosCabecera = new Vector<String>();
      vectorBusquedaAmigosCabecera.add("Nombre");
      vectorBusquedaAmigosCabecera.add("Apellidos");
      vectorBusquedaAmigosCabecera.add("Cumpleaños");
      vectorBusquedaAmigosCabecera.add("Correo Electronico");
      customTableModelBusquedaAmigos = new CustomTableModel();
      customTableModelBusquedaAmigos.setDataVector(new Vector<Vector<String>>(),
         vectorBusquedaAmigosCabecera);
      jTableBusquedaAmigos = new JTable(customTableModelBusquedaAmigos);
      jTableBusquedaAmigos.getTableHeader().setReorderingAllowed(false);
      jTableBusquedaAmigos.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
      constraints = wPosicionamiento(constraints, 0, 0, 1, 6, 1, 0,
         GridBagConstraints.BOTH, new Insets(5,10,5,5));
      jScrollPaneBusquedaAmigos = new JScrollPane(jTableBusquedaAmigos,
         ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
         ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      jPanelBusqueda.add(jScrollPaneBusquedaAmigos, constraints);

      // Caja de texto jTextFieldBusquedaBuscar
      jTextFieldBusquedaBuscar = new JTextField(32);
      constraints = wPosicionamiento(constraints, 0, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelBusqueda.add(jTextFieldBusquedaBuscar, constraints);

      // Boton jButtonBusquedaBuscarAmigos
      jButtonBusquedaBuscarAmigos = new JButton("Buscar Amigos");
      constraints = wPosicionamiento(constraints, 1, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelBusqueda.add(jButtonBusquedaBuscarAmigos, constraints);

      // Boton jButtonBusquedaVerAmigos
      jButtonBusquedaVerAmigos = new JButton("Ver Amigos");
      constraints = wPosicionamiento(constraints, 2, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelBusqueda.add(jButtonBusquedaVerAmigos, constraints);

      // Boton jButtonBusquedaCumpleanosHoy
      jButtonBusquedaCumpleanosHoy = new JButton("Cumpleaños Hoy");
      constraints = wPosicionamiento(constraints, 3, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelBusqueda.add(jButtonBusquedaCumpleanosHoy, constraints);

      // Boton jButtonBusquedaAnadirAmigo
      jButtonBusquedaAnadirAmigo = new JButton("Añadir Amigo");
      constraints = wPosicionamiento(constraints, 4, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(10,15,10,20));
      jPanelBusqueda.add(jButtonBusquedaAnadirAmigo, constraints);

      // Boton jButtonBusquedaIzquierda
      jButtonBusquedaIzquierda = new JButton("");
      jButtonBusquedaIzquierda.setIcon(new
         ImageIcon(getClass().getResource("/interfaz/imagenes/izquierda.gif")));
      constraints = wPosicionamiento(constraints, 5, 1, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(30,15,10,5));
      jPanelBusqueda.add(jButtonBusquedaIzquierda, constraints);
      // Boton jButtonBusquedaDerecha
      jButtonBusquedaDerecha = new JButton("");
      jButtonBusquedaDerecha.setIcon(new
         ImageIcon(getClass().getResource("/interfaz/imagenes/derecha.gif")));
      constraints = wPosicionamiento(constraints, 5, 2, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(30,5,10,20));
      jPanelBusqueda.add(jButtonBusquedaDerecha, constraints);
   }

   /****************************************************************************
    * Crea la pantalla de cumpleaños hoy de la aplicacion.
    ***************************************************************************/
   private void wCumpleanosHoy() {
      // Creacion del dialogo
      jDialogCumpleanosHoy = new JDialog(this, "Cumpleaños Hoy", true);

      // Creacion del panel de contenidos
      jPanelCumpleanosHoy = new JPanel(new GridBagLayout());
      jDialogCumpleanosHoy.getContentPane().add(jPanelCumpleanosHoy);

      // Tabla jTableCumpleanosHoyAmigos
      vectorCumpleanosHoyAmigosCabecera = new Vector<String>();
      vectorCumpleanosHoyAmigosCabecera.add("Nombre");
      vectorCumpleanosHoyAmigosCabecera.add("Apellidos");
      customTableModelCumpleanosHoyAmigos = new CustomTableModel();
      customTableModelCumpleanosHoyAmigos.setDataVector(new
         Vector<Vector<String>>(), vectorCumpleanosHoyAmigosCabecera);
      jTableCumpleanosHoyAmigos = new
         JTable(customTableModelCumpleanosHoyAmigos);
      jTableCumpleanosHoyAmigos.getTableHeader().setReorderingAllowed(false);
      constraints = wPosicionamiento(constraints, 0, 0, 1, 1, 1, 1,
         GridBagConstraints.BOTH, new Insets(10,10,5,10));
      jScrollPaneCumpleanosHoyAmigos = new
         JScrollPane(jTableCumpleanosHoyAmigos,
            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      jPanelCumpleanosHoy.add(jScrollPaneCumpleanosHoyAmigos, constraints);

      // Boton jButtonCumpleanosHoyCerrar
      jButtonCumpleanosHoyCerrar = new JButton("   Cerrar   ");
      constraints = wPosicionamiento(constraints, 1, 0, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,10,10,10));
      jPanelCumpleanosHoy.add(jButtonCumpleanosHoyCerrar, constraints);

      // Se ajusta el tamano
      jDialogCumpleanosHoy.setSize(300, 200);
      jDialogCumpleanosHoy.setResizable(false);
   }

   /****************************************************************************
    * Crea la pantalla de Acerca De de la aplicacion.
    ***************************************************************************/
   private void wAcercaDe() {
      // Creacion del dialogo
      jDialogAcercaDe = new JDialog(this, "Acerca De...", true);

      // Creacion del panel de contenidos
      jPanelAcercaDe = new JPanel(new GridBagLayout());
      jDialogAcercaDe.getContentPane().add(jPanelAcercaDe);

      // Etiqueta jLabelAcercaDeImagen
      jLabelAcercaDeImagen = new JLabel();
      jLabelAcercaDeImagen.setIcon(new
         ImageIcon(getClass().getResource("/interfaz/imagenes/tarta.gif")));
      constraints = wPosicionamiento(constraints, 0, 0, 1, 7, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,15,5,15));
      jPanelAcercaDe.add(jLabelAcercaDeImagen, constraints);


      // Etiqueta jLabelAcercaDeTitulo
      jLabelAcercaDeTitulo = new JLabel("Gestor de Cumpleaños");
      jLabelAcercaDeTitulo.setFont(new Font("Arial", Font.BOLD, 14));
      constraints = wPosicionamiento(constraints, 0, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(15,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeTitulo, constraints);

      // Etiqueta jLabelAcercaDeTexto1
      jLabelAcercaDeTexto1 = new JLabel("Aplicación que gestiona cumpleaños a" +
         " partir de amigos,");
      constraints = wPosicionamiento(constraints, 1, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,0,5));
      jPanelAcercaDe.add(jLabelAcercaDeTexto1, constraints);
      // Etiqueta jLabelAcercaDeTexto2
      jLabelAcercaDeTexto2 = new JLabel("similar a una red social.");
      constraints = wPosicionamiento(constraints, 2, 1, 2, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(0,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeTexto2, constraints);

      // Etiqueta jLabelAcercaDeVersion
      jLabelAcercaDeVersion = new JLabel("Version:");
      jLabelAcercaDeVersion.setFont(new Font("Arial", Font.BOLD, 11));
      constraints = wPosicionamiento(constraints, 3, 1, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeVersion, constraints);
      // Etiqueta jLabelAcercaDeVersionTexto
      jLabelAcercaDeVersionTexto = new JLabel("1.0");
      constraints = wPosicionamiento(constraints, 3, 2, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeVersionTexto, constraints);

      // Etiqueta jLabelAcercaDeCompania
      jLabelAcercaDeCompania = new JLabel("Compañia:");
      jLabelAcercaDeCompania.setFont(new Font("Arial", Font.BOLD, 11));
      constraints = wPosicionamiento(constraints, 4, 1, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeCompania, constraints);
      // Etiqueta jLabelAcercaDeCompaniaTexto
      jLabelAcercaDeCompaniaTexto = new JLabel("AelanSoft");
      constraints = wPosicionamiento(constraints, 4, 2, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeCompaniaTexto, constraints);

      // Etiqueta jLabelAcercaDeWeb
      jLabelAcercaDeWeb = new JLabel("Pagina Web:");
      jLabelAcercaDeWeb.setFont(new Font("Arial", Font.BOLD, 11));
      constraints = wPosicionamiento(constraints, 5, 1, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeWeb, constraints);
      // Etiqueta jLabelAcercaDeWebTexto
      jLabelAcercaDeWebTexto = new JLabel("http://aelansoft.blogspot.com/");
      constraints = wPosicionamiento(constraints, 5, 2, 1, 1, 0, 0,
         GridBagConstraints.HORIZONTAL, new Insets(5,5,5,5));
      jPanelAcercaDe.add(jLabelAcercaDeWebTexto, constraints);

      // Boton jButtonAcercaDeCerrar
      jButtonAcercaDeCerrar = new JButton("   Cerrar   ");
      constraints = wPosicionamiento(constraints, 6, 2, 1, 1, 0, 0,
         GridBagConstraints.NONE, new Insets(5,5,10,5));
      jPanelAcercaDe.add(jButtonAcercaDeCerrar, constraints);

      // Se ajusta el tamano
      jDialogAcercaDe.pack();
      jDialogAcercaDe.setResizable(false);
   }

   /****************************************************************************
    * Crea la ventana modal de error
    * @param dialog cuadro de dialogo padre
    * @param texto cadena de error a mostrar
    ***************************************************************************/
   private void wModalError(Component dialog, String texto) {
      Toolkit.getDefaultToolkit().beep();
      JOptionPane.showMessageDialog(dialog, texto, "Error",
         JOptionPane.ERROR_MESSAGE);
   }

   /****************************************************************************
    * Crea la ventana modal de informacion
    * @param dialog cuadro de dialogo padre
    * @param texto cadena de error a mostrar
    ***************************************************************************/
   private void wModalInfo(Component dialog, String texto) {
      JOptionPane.showMessageDialog(dialog, texto, "Informacion",
         JOptionPane.INFORMATION_MESSAGE);
   }

   /****************************************************************************
    * Crea un conjunto de propiedades para aplicar a un objeto cuando este es
    * posicionado en la pantalla, sobre un GridBagLayout.
    * @param g conjunto de especificaciones para un GridBagLayout
    * @param y fila en el GridBagLayout
    * @param x columna en el GridBagLayout
    * @param w anchura en el GridBagLayout
    * @param h altura en el GridBagLayout
    * @param wx distribucion horizontal del espacio extra
    * @param wy distribucion vertical del espacio extra
    * @param fill distribucion del espacio extra
    * @param insets paddin externo
    * @return g conjunto de especificaciones para un GridBagLayout
    ***************************************************************************/
   private static GridBagConstraints wPosicionamiento(GridBagConstraints g,
      int y, int x, int w, int h, double wx, double wy, int fill, Insets in) {
      g.gridy = y;
      g.gridx = x;
      g.gridwidth = w;
      g.gridheight = h;
      g.weightx = wx;
      g.weighty = wy;
      g.fill = fill;
      g.insets = in;
      return g;
   }

   /****************************************************************************
    * Crea los manejadores de eventos de la aplicacion
    * @param dia dia del cumpleaños (formato 1-31)
    * @param mes mes del cumpleaños (formato 1-12)
    ***************************************************************************/
   private String wDiaMesAFecha(int dia, int mes) {
      // Variables
      String fecha = new String();

      // Creamos el string fecha a partir de los datos de entrada
      fecha = "";
      fecha = fecha + String.valueOf(dia);
      fecha = fecha + " de ";
      if(mes == 1) { fecha = fecha + "Enero"; }
      if(mes == 2) { fecha = fecha + "Febrero"; }
      if(mes == 3) { fecha = fecha + "Marzo"; }
      if(mes == 4) { fecha = fecha + "Abril"; }
      if(mes == 5) { fecha = fecha + "Mayo"; }
      if(mes == 6) { fecha = fecha + "Junio"; }
      if(mes == 7) { fecha = fecha + "Julio"; }
      if(mes == 8) { fecha = fecha + "Agosto"; }
      if(mes == 9) { fecha = fecha + "Septiembre"; }
      if(mes == 10) { fecha = fecha + "Octubre"; }
      if(mes == 11) { fecha = fecha + "Noviembre"; }
      if(mes == 12) { fecha = fecha + "Diciembre"; }

      // Devolvemos la fecha formateada
      return fecha;
   }
   /****************************************************************************
    * Crea los manejadores de eventos de la aplicacion
    ***************************************************************************/
   private void ManejadorEventos() {
      // Accion al cerrar la ventana con la 'X'
      addWindowListener(new WindowAdapter() {
          public void windowClosing(WindowEvent evt) {
             AccionSalir();
          }
      });

      // Accion al pulsar el menu Archivo -> Salir
      jMenuItemArchivoSalir.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionSalir();
         }
      });

      // Accion al pulsar el menu Ayuda -> Acerca De...
      jMenuItemAyudaAcercaDe.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionAcercaDe();
         }
      });

      // Opcion al pulsar el boton Login -> Entrar
      jButtonLoginEntrar.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionLoginEntrar();
         }
      });
      // Opcion al pulsar el boton Login -> Registrarse
      jButtonLoginRegistrarse.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionLoginRegistrarse();
         }
      });

      // Opcion al pulsar el boton Registro -> Registrarse
      jButtonRegistroRegistrarse.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionRegistroRegistrarse();
         }
      });
      // Opcion al pulsar el boton Registro -> Cancelar
      jButtonRegistroCancelar.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionRegistroCancelar();
         }
      });

      // Opcion al pulsar el boton Inicio -> Buscar Amigos
      jButtonInicioBuscarAmigos.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionBuscarAmigos(jTextFieldInicioBuscar.getText());
         }
      });
      // Opcion al pulsar el boton Inicio -> Ver Amigos
      jButtonInicioVerAmigos.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionVerAmigos();
         }
      });
      // Opcion al pulsar el boton Inicio -> Cumpleaños Hoy
      jButtonInicioCumpleanosHoy.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionCumpleanosHoy();
         }
      });
      // Opcion al pulsar el boton Inicio -> Anterior
      jButtonInicioIzquierda.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionInicioIzquierda();
         }
      });
      // Opcion al pulsar el boton Inicio -> Derecha
      jButtonInicioDerecha.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionInicioDerecha();
         }
      });

      // Opcion al pulsar el boton Busqueda -> Buscar Amigos
      jButtonBusquedaBuscarAmigos.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionBuscarAmigos(jTextFieldBusquedaBuscar.getText());
         }
      });
      // Opcion al pulsar el boton Busqueda -> Ver Amigos
      jButtonBusquedaVerAmigos.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionVerAmigos();
         }
      });
      // Opcion al pulsar el boton Busqueda -> Cumpleaños Hoy
      jButtonBusquedaCumpleanosHoy.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionCumpleanosHoy();
         }
      });
      // Opcion al pulsar el boton Busqueda -> Añadir Amigo
      jButtonBusquedaAnadirAmigo.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionBusquedaAnadirAmigo();
         }
      });
      // Opcion al pulsar el boton Busqueda -> Anterior
      jButtonBusquedaIzquierda.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionBusquedaIzquierda();
         }
      });
      // Opcion al pulsar el boton Busqueda -> Derecha
      jButtonBusquedaDerecha.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionBusquedaDerecha();
         }
      });

      // Opcion al pulsar el boton Cumpleaños Hoy -> Cerrar
      jButtonCumpleanosHoyCerrar.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionCumpleanosHoyCerrar();
         }
      });

      // Opcion al pulsar el boton Acerca De -> Cerrar
      jButtonAcercaDeCerrar.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent evt) {
            AccionAcercaDeCerrar();
         }
      });
   }

   /****************************************************************************
    * Ejecuta la accion al cerrar la aplicacion
    ***************************************************************************/
   private void AccionSalir() {
      // Desconexion del servidor
      cliente.DesconectarServidor();
      // Salimos de la aplicacion
      System.exit(0);
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el menu Ayuda -> AcercaDe
    ***************************************************************************/
   private void AccionAcercaDe() {
      // Mostramos el cuadro de dialogo, centrado
      jDialogAcercaDe.setLocationRelativeTo(getContentPane());
      jDialogAcercaDe.setVisible(true);
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Login -> Entrar
    ***************************************************************************/
   private void AccionLoginEntrar() {
      // Variables
      String correo, contrasena;
      int estado;

      // Captura los datos
      correo = jTextFieldLoginCorreoElectronico.getText();
      contrasena = jPasswordFieldLoginContrasena.getText();

      // Ejecuta la accion correspondiente
      estado = cliente.LoguearUsuario(correo, contrasena);
      switch(estado) {
         case (0):
            // Creo la tabla para mostrar en la interfaz
            Vector<String> fila = new Vector<String>();
            Vector<Vector<String>> tabla = new Vector<Vector<String>>();
            // Recupera los datos y los meto en la tabla
            VectorPersonas datos = new VectorPersonas();
            datos = cliente.GetUsuario().GetAmigos().PrimPagina();
            for(int i=0; i<datos.size(); i++) {
               fila.removeAllElements();
               fila.add(((Persona)datos.get(i)).GetNombre());
               fila.add(((Persona)datos.get(i)).GetApellidos());
               ((Persona)datos.get(i)).GetDiaCumple();
               fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
                  ((Persona)datos.get(i)).GetMesCumple()));
               fila.add(((Persona)datos.get(i)).GetCorreo());
               tabla.add((Vector<String>)fila.clone());
            }
            // Refresco la tabla en la interfaz
            customTableModelInicioAmigos.setDataVector(tabla,
               vectorInicioAmigosCabecera);
            // Actualizo los botones de izquierda y derecha
            jButtonInicioIzquierda.setEnabled(false);
            jButtonInicioDerecha.setEnabled(
               cliente.GetUsuario().GetAmigos().ExisteSigPagina());

            jPanelLogin.setVisible(false);
            jPanelInicio.setVisible(true);
            this.setTitle("Gestor de Cumpleaños");

            break;
         case (23):
            wModalError(jPanelLogin,
               "Error: el correo electronico esta vacio.");
            jTextFieldLoginCorreoElectronico.requestFocus();
            break;
         case (24):
            wModalError(jPanelLogin, "Error: la contraseña esta vacia.");
            jPasswordFieldLoginContrasena.requestFocus();
            break;
         case (8):
            wModalError(jPanelLogin,
               "Error: usuario o contraseña incorrectos.");
            break;
         default:
            wModalError(jPanelLogin, "Error: fallo en la red.");
      }
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Login -> Registrarse
    ***************************************************************************/
   private void AccionLoginRegistrarse() {
      jPanelLogin.setVisible(false);
      jPanelRegistro.setVisible(true);
      this.setTitle("Gestor de Cumpleaños. Registrarse");
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Registro -> Registrarse
    ***************************************************************************/
   private void AccionRegistroRegistrarse() {
      // Variables
      String correo, contrasena, contrasena2, nombre, apellidos;
      int dia, mes;
      int estado;

      // Captura los datos
      correo = jTextFieldRegistroCorreoElectronico.getText();
      contrasena = jPasswordFieldRegistroContrasena.getText();
      contrasena2 = jPasswordFieldRegistroConfirmar.getText();
      nombre = jTextFieldRegistroNombre.getText();
      apellidos = jTextFieldRegistroApellidos.getText();
      dia = jComboBoxRegistroDia.getSelectedIndex() + 1;
      mes = jComboBoxRegistroMes.getSelectedIndex() + 1;

      // Ejecuta la accion correspondiente
      estado = cliente.Registro(nombre, apellidos, correo, contrasena,
         contrasena2, dia, mes);
      switch(estado) {
         case (0):
            wModalInfo(jPanelLogin,
               "Registro realizado correctamente.");

            // Creo la tabla para mostrar en la interfaz
            Vector<String> fila = new Vector<String>();
            Vector<Vector<String>> tabla = new Vector<Vector<String>>();
            // Recupera los datos y los meto en la tabla
            VectorPersonas datos = new VectorPersonas();
            datos = cliente.GetUsuario().GetAmigos().PrimPagina();
            for(int i=0; i<datos.size(); i++) {
               fila.removeAllElements();
               fila.add(((Persona)datos.get(i)).GetNombre());
               fila.add(((Persona)datos.get(i)).GetApellidos());
               fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
                  ((Persona)datos.get(i)).GetMesCumple()));
               fila.add(((Persona)datos.get(i)).GetCorreo());
               tabla.add((Vector<String>)fila.clone());
            }
            // Refresco la tabla en la interfaz
            customTableModelInicioAmigos.setDataVector(tabla,
               vectorInicioAmigosCabecera);
            // Actualizo los botones de izquierda y derecha
            jButtonInicioIzquierda.setEnabled(false);
            jButtonInicioDerecha.setEnabled(
               cliente.GetUsuario().GetAmigos().ExisteSigPagina());

            jPanelRegistro.setVisible(false);
            jPanelInicio.setVisible(true);
            this.setTitle("Gestor de Cumpleaños");

            break;
         case (18):
            wModalError(jPanelLogin,
               "Error: la longitud del nombre debe ser entre 2 y 20.");
            jTextFieldRegistroNombre.requestFocus();
            break;
         case (19):
            wModalError(jPanelLogin,
               "Error: la longitud de los apellidos debe ser entre 2 y 50.");
            jTextFieldRegistroApellidos.requestFocus();
            break;
         case (20):
            wModalError(jPanelLogin,
               "Error: correo electronico incorrecto.");
            jTextFieldRegistroCorreoElectronico.requestFocus();
            break;
         case (22):
            wModalError(jPanelLogin,
               "Error: error en la contraseña.");
            jPasswordFieldRegistroContrasena.requestFocus();
            break;
         case (11):
            wModalError(jPanelLogin,
               "Error: fecha incorrecta.");
            break;
         case (4):
            wModalError(jPanelLogin,
               "Error: correo electronico ya registrado anteriormente.");
            jTextFieldRegistroCorreoElectronico.requestFocus();
            break;
         default:
            wModalError(jPanelLogin, "Error: fallo en la red.");
      }
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Registro -> Cancelar
    ***************************************************************************/
   private void AccionRegistroCancelar() {
      jPanelRegistro.setVisible(false);
      jPanelLogin.setVisible(true);
      this.setTitle("Gestor de Cumpleaños");
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Inicio -> Buscar Amigos
    ***************************************************************************/
   private void AccionBuscarAmigos(String busqueda) {
      // Variables
      int estado;

      // Guardamos la busqueda en la caja de texto
      jTextFieldBusquedaBuscar.setText(busqueda);

      // Ejecuta la accion correspondiente
      estado = cliente.RealizarBusqueda(cliente.GetUsuario().GetCorreo(),
         busqueda);
      switch(estado) {
         case (0):
            // Creo la tabla para mostrar en la interfaz
            Vector<String> fila = new Vector<String>();
            Vector<Vector<String>> tabla = new Vector<Vector<String>>();
            // Recupera los datos y los meto en la tabla
            VectorPersonas datos = new VectorPersonas();
            datos = cliente.GetUsuario().GetBusqueda().PrimPagina();
            for(int i=0; i<datos.size(); i++) {
               fila.removeAllElements();
               fila.add(((Persona)datos.get(i)).GetNombre());
               fila.add(((Persona)datos.get(i)).GetApellidos());
               fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
                  ((Persona)datos.get(i)).GetMesCumple()));
               fila.add(((Persona)datos.get(i)).GetCorreo());
               tabla.add((Vector<String>)fila.clone());
            }
            // Refresco la tabla en la interfaz
            customTableModelBusquedaAmigos.setDataVector(tabla,
               vectorBusquedaAmigosCabecera);
            // Actualizo los botones de izquierda y derecha
            jButtonBusquedaIzquierda.setEnabled(false);
            jButtonBusquedaDerecha.setEnabled(
               cliente.GetUsuario().GetBusqueda().ExisteSigPagina());

            jPanelInicio.setVisible(false);
            jPanelBusqueda.setVisible(true);
            this.setTitle("Gestor de Cumpleaños. Busqueda");
            break;
         case (25):
            wModalError(jPanelBusqueda,
               "Error: la cadena de busqueda debe tener al menos 3 caracteres" +
               " seguidos y su longitud ser menor que 50.");
            jTextFieldInicioBuscar.requestFocus();
            break;
         default:
            wModalError(jPanelLogin, "Error: fallo en la red.");
      }
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Inicio -> Ver Amigos
    ***************************************************************************/
   private void AccionVerAmigos() {
      // Reseteo la caja de busqueda
      jTextFieldInicioBuscar.setText("");

      // Creo la tabla para mostrar en la interfaz
      Vector<String> fila = new Vector<String>();
      Vector<Vector<String>> tabla = new Vector<Vector<String>>();
      // Recupera los datos y los meto en la tabla
      VectorPersonas datos = new VectorPersonas();
      datos = cliente.GetUsuario().GetAmigos().PrimPagina();
      for(int i=0; i<datos.size(); i++) {
         fila.removeAllElements();
         fila.add(((Persona)datos.get(i)).GetNombre());
         fila.add(((Persona)datos.get(i)).GetApellidos());
         fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
            ((Persona)datos.get(i)).GetMesCumple()));
         fila.add(((Persona)datos.get(i)).GetCorreo());
         tabla.add((Vector<String>)fila.clone());
      }
      // Refresco la tabla en la interfaz
      customTableModelInicioAmigos.setDataVector(tabla,
         vectorInicioAmigosCabecera);
      // Actualizo los botones de izquierda y derecha
      jButtonInicioIzquierda.setEnabled(false);
      jButtonInicioDerecha.setEnabled(
         cliente.GetUsuario().GetAmigos().ExisteSigPagina());

      jPanelBusqueda.setVisible(false);
      jPanelInicio.setVisible(true);
      this.setTitle("Gestor de Cumpleaños");
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Inicio -> Cumpleaños Hoy
    ***************************************************************************/
   private void AccionCumpleanosHoy() {
      // Creo la tabla para mostrar en la interfaz
      Vector<String> fila = new Vector<String>();
      Vector<Vector<String>> tabla = new Vector<Vector<String>>();
      // Recupera los datos y los meto en la tabla
      VectorPersonas datos = new VectorPersonas();
      datos = cliente.GetUsuario().GetAmigos().CumpleanosHoy();
      for(int i=0; i<datos.size(); i++) {
         fila.removeAllElements();
         fila.add(((Persona)datos.get(i)).GetNombre());
         fila.add(((Persona)datos.get(i)).GetApellidos());
         tabla.add((Vector<String>)fila.clone());
      }
      // Refresco la tabla en la interfaz
      customTableModelCumpleanosHoyAmigos.setDataVector(tabla,
         vectorCumpleanosHoyAmigosCabecera);

      jDialogCumpleanosHoy.setLocationRelativeTo(getContentPane());
      jDialogCumpleanosHoy.setVisible(true);
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Inicio -> Anterior
    ***************************************************************************/
   private void AccionInicioIzquierda() {
      // Creo la tabla para mostrar en la interfaz
      Vector<String> fila = new Vector<String>();
      Vector<Vector<String>> tabla = new Vector<Vector<String>>();
      // Recupera los datos y los meto en la tabla
      VectorPersonas datos = new VectorPersonas();
      datos = cliente.GetUsuario().GetAmigos().AntPagina();
      for(int i=0; i<datos.size(); i++) {
         fila.removeAllElements();
         fila.add(((Persona)datos.get(i)).GetNombre());
         fila.add(((Persona)datos.get(i)).GetApellidos());
         fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
            ((Persona)datos.get(i)).GetMesCumple()));
         fila.add(((Persona)datos.get(i)).GetCorreo());
         tabla.add((Vector<String>)fila.clone());
      }
      // Refresco la tabla en la interfaz
      customTableModelInicioAmigos.setDataVector(tabla,
         vectorInicioAmigosCabecera);
      // Actualizo los botones de izquierda y derecha
      jButtonInicioIzquierda.setEnabled(
         cliente.GetUsuario().GetAmigos().ExisteAntPagina());
      jButtonInicioDerecha.setEnabled(
         cliente.GetUsuario().GetAmigos().ExisteSigPagina());
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Inicio -> Siguiente
    ***************************************************************************/
   private void AccionInicioDerecha() {
      // Creo la tabla para mostrar en la interfaz
      Vector<String> fila = new Vector<String>();
      Vector<Vector<String>> tabla = new Vector<Vector<String>>();
      // Recupera los datos y los meto en la tabla
      VectorPersonas datos = new VectorPersonas();
      datos = cliente.GetUsuario().GetAmigos().SigPagina();
      for(int i=0; i<datos.size(); i++) {
         fila.removeAllElements();
         fila.add(((Persona)datos.get(i)).GetNombre());
         fila.add(((Persona)datos.get(i)).GetApellidos());
         fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
            ((Persona)datos.get(i)).GetMesCumple()));
         fila.add(((Persona)datos.get(i)).GetCorreo());
         tabla.add((Vector<String>)fila.clone());
      }
      // Refresco la tabla en la interfaz
      customTableModelInicioAmigos.setDataVector(tabla,
         vectorInicioAmigosCabecera);
      // Actualizo los botones de izquierda y derecha
      jButtonInicioIzquierda.setEnabled(
         cliente.GetUsuario().GetAmigos().ExisteAntPagina());
      jButtonInicioDerecha.setEnabled(
         cliente.GetUsuario().GetAmigos().ExisteSigPagina());
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Busqueda -> Anterior
    ***************************************************************************/
   private void AccionBusquedaIzquierda() {
      // Creo la tabla para mostrar en la interfaz
      Vector<String> fila = new Vector<String>();
      Vector<Vector<String>> tabla = new Vector<Vector<String>>();
      // Recupera los datos y los meto en la tabla
      VectorPersonas datos = new VectorPersonas();
      datos = cliente.GetUsuario().GetBusqueda().AntPagina();
      for(int i=0; i<datos.size(); i++) {
         fila.removeAllElements();
         fila.add(((Persona)datos.get(i)).GetNombre());
         fila.add(((Persona)datos.get(i)).GetApellidos());
         fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
            ((Persona)datos.get(i)).GetMesCumple()));
         fila.add(((Persona)datos.get(i)).GetCorreo());
         tabla.add((Vector<String>)fila.clone());
      }
      // Refresco la tabla en la interfaz
      customTableModelBusquedaAmigos.setDataVector(tabla,
         vectorBusquedaAmigosCabecera);
      // Actualizo los botones de izquierda y derecha
      jButtonBusquedaIzquierda.setEnabled(
         cliente.GetUsuario().GetBusqueda().ExisteAntPagina());
      jButtonBusquedaDerecha.setEnabled(
         cliente.GetUsuario().GetBusqueda().ExisteSigPagina());
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Busqueda -> Siguiente
    ***************************************************************************/
   private void AccionBusquedaDerecha() {
      // Creo la tabla para mostrar en la interfaz
      Vector<String> fila = new Vector<String>();
      Vector<Vector<String>> tabla = new Vector<Vector<String>>();
      // Recupera los datos y los meto en la tabla
      VectorPersonas datos = new VectorPersonas();
      datos = cliente.GetUsuario().GetBusqueda().SigPagina();
      for(int i=0; i<datos.size(); i++) {
         fila.removeAllElements();
         fila.add(((Persona)datos.get(i)).GetNombre());
         fila.add(((Persona)datos.get(i)).GetApellidos());
         fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
            ((Persona)datos.get(i)).GetMesCumple()));
         fila.add(((Persona)datos.get(i)).GetCorreo());
         tabla.add((Vector<String>)fila.clone());
      }
      // Refresco la tabla en la interfaz
      customTableModelBusquedaAmigos.setDataVector(tabla,
         vectorBusquedaAmigosCabecera);
      // Actualizo los botones de izquierda y derecha
      jButtonBusquedaIzquierda.setEnabled(
         cliente.GetUsuario().GetBusqueda().ExisteAntPagina());
      jButtonBusquedaDerecha.setEnabled(
         cliente.GetUsuario().GetBusqueda().ExisteSigPagina());
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Busqueda -> Añadir Amigo
    ***************************************************************************/
   private void AccionBusquedaAnadirAmigo() {
      // Variables
      int estado, amigo;

      if(jTableBusquedaAmigos.getSelectedRowCount() != 0) {
         // Captura los datos
         amigo = jTableBusquedaAmigos.getSelectedRow();

         // Ejecuta la accion correspondiente
         estado = cliente.GetUsuario().AnadirAmigo(amigo);
         switch(estado) {
            case (0):
               wModalInfo(jPanelBusqueda,
                  "Se ha agregado con exito al usuario.");
               // Creo la tabla para mostrar en la interfaz
               Vector<String> fila = new Vector<String>();
               Vector<Vector<String>> tabla = new Vector<Vector<String>>();
               // Recupera los datos y los meto en la tabla
               VectorPersonas datos = new VectorPersonas();
               datos = cliente.GetUsuario().GetBusqueda().PrimPagina();
               for(int i=0; i<datos.size(); i++) {
                  fila.removeAllElements();
                  fila.add(((Persona)datos.get(i)).GetNombre());
                  fila.add(((Persona)datos.get(i)).GetApellidos());
                  fila.add(wDiaMesAFecha(((Persona)datos.get(i)).GetDiaCumple(),
                     ((Persona)datos.get(i)).GetMesCumple()));
                  fila.add(((Persona)datos.get(i)).GetCorreo());
                  tabla.add((Vector<String>)fila.clone());
               }
               // Refresco la tabla en la interfaz
               customTableModelBusquedaAmigos.setDataVector(tabla,
                  vectorBusquedaAmigosCabecera);
               // Actualizo los botones de izquierda y derecha
               jButtonBusquedaIzquierda.setEnabled(false);
               jButtonBusquedaDerecha.setEnabled(
                  cliente.GetUsuario().GetBusqueda().ExisteSigPagina());
               break;
            default:
               wModalError(jPanelBusqueda,  "Error: fallo en la red.");
         }
      }
      else {
         wModalError(jPanelBusqueda, "Error: selecciona un usuario.");
      }
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Busqueda -> Cerrar
    ***************************************************************************/
   private void AccionCumpleanosHoyCerrar() {
      jDialogCumpleanosHoy.setVisible(false);
   }

   /****************************************************************************
    * Ejecuta la accion al pulsar el boton Acerca De -> Cerrar
    ***************************************************************************/
   private void AccionAcercaDeCerrar() {
      jDialogAcercaDe.setVisible(false);
   }

   /****************************************************************************
    * Procedimiento principal del cliente. Comprobacion de los argumentos de
    * entrada e inicializacion de las estructuras de datos iniciales.
    * @param args argumentos de entrada
    ***************************************************************************/
   public static void main(String[] args) {
      // comprobacion de los parametros de entrada
      if (args.length != 3) {
         System.out.println("Error: faltan parametros de entrada.");
         System.out.println("       - uso: Cliente (ip) (puerto) (nombre)");
         System.exit(0);
      }

      // Lanzar interfaz grafica
      try {
         // Estilo por defecto del sistema operativo del usuario
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      }
      catch (Exception e) {
         // Si no se puede, beep
         Toolkit.getDefaultToolkit().beep();
      }

      // Inicio de la aplicacion
      new Gui(args);
      
   }

}
